package br.com.ff.tipoveiculo.session;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.commons.session.Repositorio;
import br.com.ff.tipoveiculo.dao.TipoVeiculoDAO;
import br.com.ff.tipoveiculo.entidade.TipoVeiculo;
import br.com.ff.tipoveiculo.to.TipoVeiculoTO;

@Stateless
@Local(TipoVeiculoLocal.class)
public class TipoVeiculoSessionBean implements TipoVeiculoLocal {

	@EJB
	Repositorio repositorio;
	
	TipoVeiculoDAO tipoVeiculoDAO;
	
	@SuppressWarnings("unused")
	@PostConstruct
	private void inicializar() {
		tipoVeiculoDAO = repositorio.getTipoVeiculoDAO();
	}
	
	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public List<TipoVeiculoTO> findAll() {
		 
		List<TipoVeiculoTO> resultado = new ArrayList<TipoVeiculoTO>();
		
		 List<TipoVeiculo> tiposVeiculo = tipoVeiculoDAO.findAll(TipoVeiculo.class);
		 for (TipoVeiculo tipoVeiculo : tiposVeiculo) {
			 resultado.add(tipoVeiculo.parseTipoVeiculoTO());
		}
		 
		return resultado;
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean salvar(TipoVeiculoTO tipoVeiculoTO) throws EntidadeDuplicadaException {
		
		validarSalvar(tipoVeiculoTO);
		
		TipoVeiculo tipoVeiculo = new TipoVeiculo(tipoVeiculoTO);
		tipoVeiculo.setDataCadastro(new Date());
		
		tipoVeiculoDAO.salvar(tipoVeiculo);
		return true;
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public TipoVeiculoTO findById(Long id) {
		
		TipoVeiculo tipoVeiculo = 
			(TipoVeiculo)tipoVeiculoDAO.findById(TipoVeiculo.class, id);
			
		TipoVeiculoTO result = tipoVeiculo.parseTipoVeiculoTO();
		
		return result;
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void atualizar(TipoVeiculoTO tipoVeiculoTO) throws EntidadeDuplicadaException {	
		
		validarSalvar(tipoVeiculoTO);
		
		TipoVeiculo tipoVeiculo = (TipoVeiculo)tipoVeiculoDAO.findById(TipoVeiculo.class, tipoVeiculoTO.getId());
		
		tipoVeiculo.setDescricao(tipoVeiculoTO.getDescricao());
		tipoVeiculo.setStatus(tipoVeiculoTO.getStatus().getStatus());
		tipoVeiculo.setTipoVeiculo(tipoVeiculoTO.getTipoVeiculo());
		
		tipoVeiculoDAO.atualizar(tipoVeiculo);
	}

	@SuppressWarnings("unchecked")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void remover(Long id) {
		TipoVeiculo tipoVeiculo = (TipoVeiculo)tipoVeiculoDAO.findById(TipoVeiculo.class, id);
		tipoVeiculoDAO.remover(tipoVeiculo);
	}
	
	
	private void validarSalvar(TipoVeiculoTO tipoVeiculoTO) throws EntidadeDuplicadaException {
		List<TipoVeiculo> tiposVeiculos = tipoVeiculoDAO.findByTipoVeiculo(tipoVeiculoTO);
		
		if (!tiposVeiculos.isEmpty() &&
				!tiposVeiculos.get(0).getId().equals(tipoVeiculoTO.getId())) {
			throw new EntidadeDuplicadaException("Ja existe tipo de veiculo: " + tipoVeiculoTO.getTipoVeiculo());
		}
	}

}
